/**
 * 统一的API请求工具
 * 自动处理token认证和错误处理
 */

const BASE_URL = 'http://47.94.6.186:3001/api';

/**
 * 发起HTTP请求
 * @param {Object} options 请求配置
 * @param {string} options.url 请求地址（相对路径）
 * @param {string} options.method 请求方法
 * @param {Object} options.data 请求数据
 * @param {Object} options.header 请求头（可选）
 * @param {boolean} options.needAuth 是否需要token认证（默认true）
 * @returns {Promise} 请求Promise
 */
function request(options) {
  return new Promise((resolve, reject) => {
    // 构建完整的请求URL
    const url = options.url.startsWith('http') ? options.url : BASE_URL + options.url;
    
    // 构建请求头
    let header = {
      'Content-Type': 'application/json',
      ...options.header
    };
    
    // 如果需要认证，添加token到请求头
    if (options.needAuth !== false) {
      const token = wx.getStorageSync('token');
      if (token) {
        header['Authorization'] = `Bearer ${token}`;
        // 或者根据后端要求使用其他格式
        // header['token'] = token;
      }
    }
    
    wx.request({
      url: url,
      method: options.method || 'GET',
      data: options.data,
      header: header,
      success: (res) => {
        console.log('API请求成功:', url, res.data);
        
        // 统一处理响应
        if (res.statusCode === 200) {
          // 检查业务状态码
          if (res.data.code === 200 || res.data.code === '200') {
            resolve(res.data);
          } else if (res.data.code === 401 || res.data.code === '401') {
            // token过期或无效，清除本地存储并跳转到登录页
            wx.removeStorageSync('token');
            wx.removeStorageSync('refreshToken');
            wx.removeStorageSync('userInfo');
            wx.removeStorageSync('userid');
            
            wx.showToast({
              title: '登录已过期，请重新登录',
              icon: 'none'
            });
            
            setTimeout(() => {
              wx.navigateTo({
                url: '/pages/login/login'
              });
            }, 1500);
            
            reject(res.data);
          } else {
            // 其他业务错误
            wx.showToast({
              title: res.data.message || '请求失败',
              icon: 'none'
            });
            reject(res.data);
          }
        } else {
          // HTTP状态码错误
          wx.showToast({
            title: '网络请求失败',
            icon: 'none'
          });
          reject(res);
        }
      },
      fail: (err) => {
        console.error('API请求失败:', url, err);
        wx.showToast({
          title: '网络连接失败',
          icon: 'none'
        });
        reject(err);
      }
    });
  });
}

/**
 * GET请求
 * @param {string} url 请求地址
 * @param {Object} data 请求参数
 * @param {Object} options 其他配置
 */
function get(url, data = {}, options = {}) {
  return request({
    url,
    method: 'GET',
    data,
    ...options
  });
}

/**
 * POST请求
 * @param {string} url 请求地址
 * @param {Object} data 请求数据
 * @param {Object} options 其他配置
 */
function post(url, data = {}, options = {}) {
  return request({
    url,
    method: 'POST',
    data,
    ...options
  });
}

/**
 * PUT请求
 * @param {string} url 请求地址
 * @param {Object} data 请求数据
 * @param {Object} options 其他配置
 */
function put(url, data = {}, options = {}) {
  return request({
    url,
    method: 'PUT',
    data,
    ...options
  });
}

/**
 * DELETE请求
 * @param {string} url 请求地址
 * @param {Object} data 请求数据
 * @param {Object} options 其他配置
 */
function del(url, data = {}, options = {}) {
  return request({
    url,
    method: 'DELETE',
    data,
    ...options
  });
}

module.exports = {
  request,
  get,
  post,
  put,
  delete: del
};